package com.zlsy.thread.synchronizedlearing;

/**
 * @author zhouliang
 * @date 2020/03/19
 * <p>
 * synchronized可重入性测试：同一个方法是可以重入的。
 **/
public class SynchronizedReentrantTest1 {

    int a = 0;

    public static void main(String[] args) {
        SynchronizedReentrantTest1 instance = new SynchronizedReentrantTest1();
        instance.method();
    }

    /**
     * 对象锁，锁为：SynchronizedReentrantTest1
     */
    private synchronized void method() {
        System.out.println("这是方法1");
        if (a == 0) {
            a++;
            //同一个对象的，同一个方法，在第一次进入该方法的时候到这里锁还没释放
            //还能再次调用method吗？
            method();
            //答案是可以的，该线程已经持有锁了，再次进入这个需要获取锁的方法时
            //不需要释放锁然后再次去竞争锁。
            //同一线程的外层函数获得锁之后，内层函数可以直接再次获得该锁。
        }
    }
}
